# Техническое задание
## Описание:

## Название:
Pocket Investor

## Предметная область:
Финансы

Сервис для учета и организации инвестиционного портфеля. Сервис предоставляет возможность наглядной визуализации структуры инвестиционного портфеля, его диверсификации по эмитентам и доходности. Помимо этого сервис предоставляет возможность просматривать портфели других пользователей системы, а также информацию об этих пользователях. Сервис предоставляет возможность регистрации и авторизации пользователя в системе.
Данные о стоимости ценных бумаг в портфеле соответствуют данным, представленным на Нью-Йоркской фондовой бирже, однако в силу политики и тарифа API биржи допустимо некоторое отставание от данных в реальном времени.

## Данные:

- Сущность portfolio (портфель пользователя)<br>
id - serial not null primary key<br>
total_cost             float (> 0)<br>
delta                 float (> 0)<br>
delta_percentage       float (> 0)<br>

- Сущность user (пользователь)<br>
id - serial not null primary key<br>
name - varchar(256)<br>
surname - varchar(256)<br>
age - bigint<br>
gender - bigint<br>
education - varchar(256)<br>
qualified_investor_status - boolean<br>
registration_date - timestamp not null<br>
portfolio_id - bigint foreign key portfolio (id)<br>
github_login - varchar(256) not null<br>

- Сущность asset (ценный актив)<br>
id - serial not null  primary key<br>
ticker - varchar(256) not null unique<br>
last_price - float not null ( > 0)<br>
last_time - timestamp not null<br>

- Сущность trade (сделка)<br>
id - serial not null  primary key<br>
asset_id - bigint not null foreign key asset (id)<br>
amount - bigint ( > 0)<br>
price - float (> 0)<br>

- Связующая таблица отношения один ко многим portfolio_trades для сущностей “Портфель” и “Сделка”<br>
portfolio_id - bigint, foreign key portfolio (id)<br>
trades_id - bigint foreign key trade (id)<br>


## Общие ограничения целостности:
Для каждого пользователя в обязательном порядке создается портфель, пользователь без портфеля существовать не может.

## Пользовательские роли:

- Посетитель<br>
Имеет возможность ознакомления с описанием и инструкцией использования сайта, а также возможность просмотра портфелей пользователей, зарегистрированных в системе. Может авторизоваться в системе при помощи аккаунта GitHub.<br>
Количество посетителей в системе не ограничено.

- Пользователь<br>
Имеет возможность обновления собственного инвестиционного портфеля и персональной информации, а также просмотра портфелей других пользователей. Не имеет возможности редактирования портфелей других пользователей и их личной информации.<br> 
Количество пользователей в системе ограничено размером базы данных.

## UI/API:
См. файл «Инструкция пользователя»

## Технологии разработки:

### Языки программирования:
- Java, Kotlin, JavaScript
- Фреймворк Spring Boot, сборщик проектов Maven, фреймворк Angular JS, HTML, CSS

## СУБД:
- PostgrSQL
- ORM фреймворк Hibernate, Java persistence API